package com.xtpt.disaster.utils;

import com.alibaba.fastjson.JSON;
import com.xtpt.disaster.bean.ActionParameters;
import com.xtpt.disaster.bean.ParametersTask;
import com.xtpt.disaster.bean.QuartzEntity;
import com.xtpt.disaster.bean.TaskInfo;
import com.xtpt.disaster.common.PortalResult;
import com.xtpt.disaster.common.PropertyConfig;
import com.xtpt.disaster.common.consts.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

/**
 * @author jack_xin
 * @ClassName QuartzSendBack
 * @Desc 据库备份以及文件备份任务提交时，调用该公共方法，该方法根据taskInfo和actionParameters对象组装出quartzEntity对象，
 * @Desc 然后将quartzEntity解析为json，通过post请求调用quartz任务设置及发起接口，返回任务设置成功或失败信息PortalResults
 * @date 2021年11月16日 15:18
 * @Version 1.0
 */
@Component
public class QuartzSendBack {
    @Autowired
    PropertyConfig config;

    /*
     * @Author jack xin
     * @Method Name taskCallBack
     * @Desc 数据库备份以及文件备份任务提交时，调用该公共方法，该方法根据taskInfo和actionParameters对象组装出quartzEntity对象，
     * @Desc 然后将quartzEntity解析为json，通过post请求调用quartz任务设置及发起接口，返回任务设置成功或失败信息PortalResults
     * @Param [taskInfo, actionParameters]
     * @return com.xtpt.disaster.common.PortalResult
     * @Date 16:39 2021/11/16
    **/
    public PortalResult taskCallBack(TaskInfo taskInfo, ActionParameters actionParameters) {
        return getQuartzEntity(taskInfo, actionParameters);
    }

    private PortalResult getQuartzEntity(TaskInfo taskInfo, ActionParameters actionParameters) {
        QuartzEntity quartzEntity = new QuartzEntity(taskInfo.getTaskId().toString(),
                taskInfo.getTaskDesc(),
                taskInfo.getTaskDesc(),
                ScheduleTypeEnum.getObject(taskInfo.getTaskExectype()),
                IntervalTypeEnum.getObject(taskInfo.getTaskUnit()),
                taskInfo.getTaskUnitCount(),
                actionParameters,
                taskInfo.getTaskStarttime(),
                taskInfo.getTaskEndtime());

        boolean res = this.requestQuartzServer(quartzEntity);
        if (res) return PortalResult.ok();
        else return PortalResult.error("添加调度任务失败！");
    }

    /*
     * @Author jack xin
     * @Method Name sqlServerTaskCallBack
     * @Desc 数据库备份以及文件备份任务提交时，调用该公共方法，该方法根据taskInfo和actionParameters对象组装出quartzEntity对象，
     * @Desc 然后将quartzEntity解析为json，通过post请求调用quartz任务设置及发起接口，返回任务设置成功或失败信息PortalResults
     * @Param [taskInfo, actionParameters]
     * @return com.xtpt.disaster.common.PortalResult
     * @Date 16:39 2021/11/16
     **/
    public PortalResult sqlServerTaskCallBack(TaskInfo taskInfo, ActionParameters actionParameters) {
        return getQuartzEntity(taskInfo, actionParameters);
    }

    /**
     * 构造请求实体
     * @param taskInfo 任务参数（传入前先生成 taskID 并赋值给 taskInfo）
     * @param callBackUrl 当前任务执行接口 url
     * @param callBackParameters 当前任务接口所需参数
     * @return 可以直接用作请求的实体
     */
    public static QuartzEntity generateQuartzEntity(ParametersTask taskInfo, String callBackUrl,Object callBackParameters) {
        return generateQuartzEntity(taskInfo,callBackUrl,"POST",callBackParameters);
    }

    public static QuartzEntity generateQuartzEntity(ParametersTask taskInfo, String callBackUrl,String callBackMethod,Object callBackParameters) {
        ActionParameters actionParameters=new ActionParameters();
        actionParameters.setRequestParameters(callBackParameters);
        actionParameters.setRequestMethod(callBackMethod);
        actionParameters.setRequestUrl(callBackUrl);
        QuartzEntity quartzEntity = new QuartzEntity(
                taskInfo.getTaskId().toString(),
                taskInfo.getTaskName(),
                taskInfo.getTaskDesc(),
                ScheduleTypeEnum.getObject(taskInfo.getTaskExectype()),
                IntervalTypeEnum.getObject(taskInfo.getTaskUnit()),
                taskInfo.getTaskUnitCount(),
                actionParameters,
                taskInfo.getTaskStarttime(),
                taskInfo.getTaskEndtime());
        if(taskInfo.getOldJobName()!=null)
        {
            quartzEntity.setOldJobName(taskInfo.getOldJobName());
        }
        return quartzEntity;
    }



    /**
     * 提交调度任务请求并返回是否成功
     * @param quartzEntity 任务请求实体
     * @return 添加调度是否成功
     */
    public boolean requestQuartzServer(QuartzEntity quartzEntity) {
        String requestQuartzUrl= "http://"+config.getQuartzServerIp()+":"+config.getQuartzServerPort()+config.getQuartz_add();
        String s = JSON.toJSONString(quartzEntity);
        boolean statusOK=false;
        try
        {
            String p = cn.hutool.http.HttpUtil.post(requestQuartzUrl, s);
            PortalResult result= JSON.parseObject(p, PortalResult.class);
            statusOK = result.getStatus().equals(StatusConst.SUCCESS);
            if(!statusOK)
            {
                LogUtil.logger.error(result.getMsg());
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return statusOK;
    }

    /**
     * 提交任务并获取结果
     * @param taskInfo 任务参数（传入前先生成 taskID 并赋值给 taskInfo）
     * @param callBackUrl 当前待提交任务执行接口 url
     * @param callBackParameters 当前待提交任务接口所需参数
     * @return 调度任务是否创建成功
     */
    public boolean taskRegister(ParametersTask taskInfo, String callBackUrl,Object callBackParameters)
    {
        return requestQuartzServer(generateQuartzEntity(taskInfo,callBackUrl,callBackParameters));
    }
    /**
     * 提交任务并获取结果(ActionParameters 为 TaskInfo 时)
     * @param taskInfo 任务参数（传入前先生成 taskID 并赋值给 taskInfo）
     * @param callBackUrl 当前待提交任务执行接口 url
     * @return 调度任务是否创建成功
     */
    public boolean taskRegister(ParametersTask taskInfo, String callBackUrl)
    {
        return requestQuartzServer(generateQuartzEntity(taskInfo,callBackUrl,taskInfo));
    }


}
